package com.owc.dao;

import com.owc.domain.dto.TokenInfo;
import com.owc.domain.dto.admin.AccountInfo;
import com.owc.domain.dto.admin.FundsDTO;
import com.owc.domain.entity.TokenBalance;

import java.math.BigDecimal;
import java.util.List;

import com.owc.domain.vo.admin.FundsVo;
import org.apache.ibatis.annotations.Param;

public interface TokenBalanceMapper extends BaseMapper<TokenBalance,Long> {
    List<TokenInfo> selectUserTokenList(@Param("userId") Long userId);

    /**
     * Get user token balance.
     *
     * @param userId  userId
     * @param tokenId TokenId
     */
    TokenBalance selectByUserIdAndTokenId(@Param("userId") Long userId, @Param("tokenId") Long tokenId);
    /**
     * Get user token balance.
     *
     * @param userId  userId
     * @param tokenName TokenName
     */
    TokenBalance selectByUserIdAndTokenName(@Param("userId") Long userId, @Param("tokenName") String tokenName);

    /**
     * Update account token balance.
     *
     * @param amount If is negative number. Balance deduct.
     *               If is positive number. Balance increase
     */
    void updateBalance(@Param("userId") Long userId, @Param("tokenId") Long tokenId, @Param("amount") BigDecimal amount);

    /**
     * 修改账户代币余额表中的冻结金额
     *
     * @param userId  用户ID
     * @param tokenId 代币ID
     * @param amount  修改金额 (负数则为减少 正数增加)
     */
    void updateFreezeAmount(@Param("userId") Long userId, @Param("tokenId") Long tokenId, @Param("amount") BigDecimal amount);

    /**
     * 修改用户代币余额表中的可用余额
     *
     * @param userId  用户ID
     * @param tokenId 代币ID
     * @param amount  修改金额 (负数则为减少 正数增加)
     */
    void updateNormalAmount(@Param("userId") Long userId, @Param("tokenId") Long tokenId, @Param("amount") BigDecimal amount);

    /**
     * 获取用户钱包列表信息
     */
    List<AccountInfo> selectUserTokenListWithAdmin(Long userId);

    List<FundsDTO> selectByQueryModel(@Param("queryModel") FundsVo fundsVo);

    List<String> selectAddressListByTokenName(@Param("tokenName") String tokenName);

    void updateWalletBalance(@Param("balance") BigDecimal balance, @Param("tokenName") String tokenName, @Param("address") String address);
}